import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号

# 数据准备
methods = ['MF', 'LightGCN', 'IPS', 'CausE', 'DICE', 'MACR', 'Ours']
cf_hr = [0.097, 0.102, 0.131, 0.148, 0.153, 0.162, 0.189]
improvement = [round((0.189 - val) / val * 100, 1) for val in cf_hr]  # 计算提升百分比

# 创建专业图表
plt.figure(figsize=(6,3), dpi=600)

# 设置柱状图颜色
colors = ['#1f77b4' if method != 'Ours' else '#d62728' for method in methods]

# 绘制柱状图
bars = plt.bar(methods, cf_hr, color=colors, edgecolor='black', alpha=0.8)

# 添加数据标签
for i, bar in enumerate(bars):
    height = bar.get_height()
    # 为本文方法添加特殊标注
    if methods[i] == 'Ours':
        plt.text(bar.get_x() + bar.get_width()/2., height + 0.005, 
                 f'{height:.3f}\n(+{improvement[i]}%)', 
                 ha='center', va='bottom', fontsize=10, fontweight='bold', color='red')
    else:
        plt.text(bar.get_x() + bar.get_width()/2., height + 0.003, 
                 f'{height:.3f}', 
                 ha='center', va='bottom', fontsize=10)

# 设置标题和标签
# plt.title('KuaiRec数据集上反事实效果对比 (CF-HR@10)', fontsize=14, fontweight='bold', pad=15)
plt.xlabel('Method', fontsize=12, fontweight='bold')
plt.ylabel('CF-HR@10', fontsize=12, fontweight='bold')

# 设置Y轴范围
plt.ylim(0.08, 0.21)

# 添加网格线（浅灰色，水平线）
plt.grid(axis='y', linestyle='--', alpha=0.3, color='gray')

# 添加性能提升箭头
# plt.annotate('', xy=(6, 0.189), xytext=(5, 0.162),
#              arrowprops=dict(arrowstyle='->', color='green', lw=2, linestyle='-'))
# plt.text(5.5, 0.175, '+16.7%', fontsize=11, color='green', ha='center')

# 添加说明文本
# plt.text(3.5, 0.18, '本文方法显著提升反事实效果\n证明对长尾物品推荐的有效性', 
#          fontsize=11, bbox=dict(facecolor='yellow', alpha=0.2))

# # 添加图例说明
# plt.text(0.5, 0.085, 'CF-HR@10: 反事实命中率@10，衡量模型挖掘用户对长尾物品潜在偏好的能力', 
#          fontsize=10, style='italic')

# 优化布局
plt.tight_layout()

# 保存高质量图片
plt.savefig('cf_hr_comparison.png', bbox_inches='tight', dpi=600)
plt.show()
